package pzc.lang;

/**
 * Stringの作成補助クラス.
 * <p>
 * 改行文字が入るので、わかりやすいです
 *
 */
public class StringBuilderExt {

    /** 改行. */
    private static final String CS_RETURN = System.getProperty("line.separator");

    /** 実際のStringBuffer. */
    private StringBuffer sbReal = new StringBuffer();

    /**
     * ストリングの追加.
     * <p>
     * StringBufferにストリングを追加する
     *
     * @param s
     *            ストリング
     */
    public void append(Object s) {
        this.sbReal.append(s);
    }

    /**
     * ストリングの追加.
     * <p>
     * ストリングの後ろに改行を付いて、StringBufferに追加する
     *
     * @param s
     *            ストリング
     */
    public void appendLine(Object s) {
        this.sbReal.append(s + StringBuilderExt.CS_RETURN);
    }

    /**
     * ストリングの追加.
     * <p>
     * ストリングをStringBufferの頭に追加する
     *
     * @param s
     *            ストリング
     */
    public void appendToHead(Object s) {
        this.sbReal.insert(0, s);
    }

    /**
     * 実際のStringBufferの長さを取得する.
     * <p>
     * 実際のStringBufferの長さを取得する
     *
     * @return StringBufferの長さ
     */
    public int length() {
        return this.sbReal.length();
    }

    /**
     * 文字の削除.
     * <p>
     * StringBufferの後ろから、渡されたの数字によって、何個の文字を削除する
     *
     * @param count
     *            削除したい文字数
     */
    public void removeLast(int count) {
        int start = this.sbReal.length() - count;
        int end = this.sbReal.length();
        this.sbReal.delete(start, end);
    }

    /**
     * 文字の削除.
     * <p>
     * StringBufferの前から、渡されたの数字によって、何個の文字を削除する
     *
     * @param count
     *            削除したい文字数
     */
    public void removeFirst(int count) {
        int start = 0;
        int end = count;
        this.sbReal.delete(start, end);
    }

    /**
     * StringBufferに空白行を削除する
     * <p>
     * StringBufferに空白行を削除する
     */
    public void clearBlankLine() {
        String tmpStr = this.sbReal.toString();
        while (tmpStr.indexOf(StringBuilderExt.CS_RETURN
                + StringBuilderExt.CS_RETURN) >= 0) {
            tmpStr = tmpStr.replaceAll(StringBuilderExt.CS_RETURN
                    + StringBuilderExt.CS_RETURN,
                    StringBuilderExt.CS_RETURN);
        }
        this.sbReal = new StringBuffer(tmpStr);
    }

    /**
     * StringBufferにすべての改行文字を削除する
     * <p>
     * そうしたら、一行になります
     */
    public void clearAllReturn() {
        String tmpStr = this.sbReal.toString();
        tmpStr = tmpStr.replaceAll(StringBuilderExt.CS_RETURN, "");
        this.sbReal = new StringBuffer(tmpStr);
    }

    /**
     * 文字列の入れ替え.
     * <p>
     * 文字列の入れ替え
     *
     * @param findString
     *            入れ替えられる文字列
     * @param replacement
     *            入れ替え文字列
     */
    public void replace(String findString, String replacement) {
        String tmpStr = this.sbReal.toString();
        tmpStr = tmpStr.replace(findString, replacement);
        this.sbReal = new StringBuffer(tmpStr);
    }

    /**
     * 文字列の入れ替え（複数）.
     * <p>
     * 文字列の入れ替え（複数）
     *
     * @param findString
     *            入れ替えられる文字列
     * @param replacement
     *            入れ替え文字列
     */
    public void replaceAll(String findString, String replacement) {
        String tmpStr = this.sbReal.toString();
        while (tmpStr.indexOf(findString) >= 0) {
            tmpStr = tmpStr.replace(findString, replacement);
        }
        this.sbReal = new StringBuffer(tmpStr);
    }

    /**
     * ObjectのtoString()を上書く
     * <p>
     * ObjectのtoString()を上書く
     *
     * @return SQLストリング
     */
    public String toString() {
        return this.sbReal.toString();
    }
}
